//数组容器中的元素是栈
#include <iostream>
using namespace std;
//变长数组
template<class T>
class Vector{
private:
    int len;//数组长度
    T* arr;//数组元素指针
public:
    Vector(int size=2){
        len=size;
        arr=new T[len];//数组动态开辟空间
    }
    T& operator[](int i){
        if(i>=len)resize(i+1);
        return arr[i];
    }
    //数组增大函数
    void resize(int size){
        if(size<=len)return;
        T* tmp=new T[size];
        for(int i=0;i<len;i++){
            tmp[i]=arr[i];
        }
        delete[] arr;
        arr=tmp;
        len=size;
    }
    //数组查看长度
    int size(){return len;};
    ~Vector(){
        delete[] arr;
        arr=NULL;
    }
};
//栈
template<class DataType>
class stack{
private:
    DataType* data;//数据域
    int size;//栈的实际大小
    int top;//栈顶指针
public:
    //重写=实现深拷贝
    stack& operator&=(const stack& s){
        delete[] data;
        size=s.size;
        data=new DataType[size];
        for(int i=0;i<size;i++){
            data[i]=s.data[i];
        }
        top=s.top;
        return *this;
    }
    //栈的初始化
    stack(int sz=2){
        this->data=new DataType[sz];
        this->top=0;
        this->size=sz;
    }
    //判空函数
    bool isempty(){return this->top==0;}
    //判满函数
    bool isfull(){return this->top==this->size;}
    //入栈函数
    bool push(const DataType& num){
        if(!isfull()){
            data[top++]=num;
            cout<<num<<"--入栈成功"<<endl;
            return true;
        }
        else cout<<"栈满不能入栈"<<endl;
        return false;
    }
    //出栈函数
    bool pop(DataType& num){
        if(!this->isempty()){
            num=this->data[--(this->top)];
            return true;
        }
        return false;
    }
    //栈的销毁
    ~stack(){
        delete this->data;
        this->data=NULL;
    }
};
int main()
{
    Vector<stack<string>> arr;
    arr[0].push("1");arr[0].push("2");
    arr[1].push("3");arr[1].push("4");
    arr[2].push("5");arr[2].push("6");
    for(int i = 0; i < arr.size(); i++){
        while(!arr[i].isempty()){
            string temp;
            arr[i].pop(temp);
            cout << temp << " ";
        }
        cout << endl;
    }
    return 0;
}